/**************************************************************************
 *
 * Copyright (C) 2007 University of California, Los Angeles.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 *************************************************************************/

/**
 * 
 */
package edu.ucla.cs.typecast.net;

import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;

import edu.ucla.cs.typecast.scope.NetScope;
import edu.ucla.cs.typecast.scope.TTLScope;

/**
 *
 * @date Jul 27, 2007
 */
public class MulticastTransportSender extends AbstractUDPTransportSender implements TypeCastConstants {


	public MulticastTransportSender(EndPoint source, EndPoint target) throws IOException { 
		super(source, target); 
	}
	
	protected DatagramSocket createSocket(EndPoint source, EndPoint target) throws IOException { 
		if (!target.getAddress().isMulticastAddress()) { 
			throw new RuntimeException(target.getAddress() + " is not multicast address"); 
		}
		MulticastSocket socket; 
		InetSocketAddress localAddr; 
		if (source == null) { 
			localAddr = new InetSocketAddress(NetUtil.getLocalHost(), 0); 
		} else { 
			if (source.getAddress() == null) { 
				localAddr = new InetSocketAddress(NetUtil.getLocalHost(), source.getPort());
			} else { 
				localAddr = new InetSocketAddress(source.getAddress(), source.getPort()); 
			}			
		}
		socket = new MulticastSocket(localAddr); 
		socket.setLoopbackMode(false); 
		socket.setTimeToLive(MAX_TTL);		
		return socket; 
	}
	/* (non-Javadoc)
	 * @see edu.ucla.cs.typecast.net.TransportSender#close()
	 */
	public void shutdownSocket(DatagramSocket socket) throws IOException {
		socket.close(); 
	}

	public void setNetScope(NetScope scope) throws IOException { 
		super.setNetScope(scope); 
		if (scope instanceof TTLScope) { 
			MulticastSocket mSocket = (MulticastSocket)getSocket(); 
			mSocket.setTimeToLive(((TTLScope)scope).getTTL()); 
		}
	}

	
}
